package com.itheima.security.distributed.uaa.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

/**
 * @author Administrator
 * @version 1.0
 * 令牌发放配置----专注令牌本身的配置
 **/
@Configuration
public class TokenConfig {

    private String SIGNING_KEY = "uaa123";

    @Bean
    public TokenStore tokenStore() {
        //JWT令牌存储方案
        return new JwtTokenStore(accessTokenConverter());
    }

    /**
     * 令牌转换器
     *
     * Spring Security OAuth2 在使用 JWT 时，默认会自动将一些标准的认证信息写入 token。
     * user_name: 用户名（来自 Authentication 对象中的 principal）
     * authorities: 用户的权限列表（如 ROLE_USER, ROLE_ADMIN 等）
     * scope: 授权范围（如 read, write）
     * exp: token 过期时间戳
     * jti: 唯一标识符（用于防止重复使用 token）
     * client_id: 客户端 ID
     * grant_type: 授权类型（如 password, authorization_code）
     *
     * @return
     */
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey(SIGNING_KEY); //对称秘钥,认证服务通过这个秘钥来编码和认证令牌,但是基于jwt,那么认证服务只需根据这个密钥签发令牌即可
        return converter;
    }

   /* @Bean
    public TokenStore tokenStore() {
        //使用内存存储令牌（普通令牌）
        return new InMemoryTokenStore();
    }*/
}
